﻿#include "FileOperator.h"


FileOperator::FileBin::FileBin(const char *pFile, const char *pMode)
{
	fid = fopen(pFile, pMode);
}

FileOperator::FileBin::~FileBin()
{
	if (fid != nullptr)
	{
		fclose(fid);
	}
}

FILE * FileOperator::FileBin::FileInstance()
{
	return fid;
}

bool FileOperator::AppendKLine(FILE *pFile, const MData::KLineItem &pItem)
{
	if (pFile == nullptr)
	{
		return false;
	}
	fwrite(&pItem, sizeof(MData::KLineItem), 1, pFile);
	return true;
}

bool FileOperator::AppendPrice(FILE *pFile, const MData::PriceItem &pItem)
{
	if (pFile == nullptr)
	{
		return false;
	}
	fwrite(&pItem, sizeof(MData::PriceItem), 1, pFile);
	return true;
}

bool FileOperator::ReadLastKLine(FILE *pFile, MData::KLineItem &outItem)
{
	if (pFile == nullptr)
	{
		return false;
	}
	fseek(pFile, 0, SEEK_END);
	int len = ftell(pFile);
	int ksize = len / sizeof(MData::KLineItem);
	if (ksize > 0)
	{
		fseek(pFile, (ksize - 1) * sizeof(MData::KLineItem), SEEK_SET);
		fread(&outItem, sizeof(MData::KLineItem), 1, pFile);
		return true;
	}
	return false;
}
//
//bool FileOperator::ResaveLastKLine(FILE *pFile, const MData::KLineItem &newItem)
//{
//	if (pFile == nullptr)
//	{
//		return false;
//	}
//	fseek(pFile, 0, SEEK_END);
//	long len = ftell(pFile);
//	long ksize = len / sizeof(MData::KLineItem);
//	if (ksize > 0)
//	{
//		long laskKItempos = (ksize - 1) * sizeof(MData::KLineItem);
//		fseek(pFile, laskKItempos, SEEK_SET);
//		MData::KLineItem oldKItem;
//		fread(&oldKItem, sizeof(MData::KLineItem), 1, pFile);
//		if (oldKItem.UpdateTime == newItem.UpdateTime)
//		{
//			fseek(pFile, laskKItempos, SEEK_SET);
//		}
//	}
//	fwrite(&newItem, sizeof(MData::KLineItem), 1, pFile);
//
//	return true;
//}

bool FileOperator::ReadLastPrice(FILE *pFile, MData::PriceItem &outItem)
{
	if (pFile == nullptr)
	{
		return false;
	}
	fseek(pFile, 0, SEEK_END);
	int len = ftell(pFile);
	int ksize = len / sizeof(MData::PriceItem);
	fseek(pFile, (ksize - 1) * sizeof(MData::PriceItem), SEEK_SET);
	fread(&outItem, sizeof(MData::PriceItem), 1, pFile);

	return true;
}
